package com.senlingspace.common.utils;

import org.springframework.util.Assert;

import java.math.BigDecimal;
import java.text.DecimalFormat;

/**
 * 金额转换
 *
 * @author lebronjames
 */
public abstract class MoneyUtils {


    private MoneyUtils() {
    }

    /**
     * 将单位为元的金额转换为单位为分
     *
     * @param yuan 单位为元的字符型值
     * @return
     */
    public static int yuan2Fen(String yuan) {
        int value = 0;

        try {
            BigDecimal var1 = new BigDecimal(yuan);
            BigDecimal var2 = new BigDecimal(100);
            BigDecimal var3 = var1.multiply(var2);
            value = Integer.parseInt(var3.stripTrailingZeros().toPlainString());
        } catch (Exception e) {
            throw new IllegalArgumentException(String.format("非法金额[%s]", yuan));
        }

        Assert.isTrue(value >= 0, String.format("非法金额[%s]", yuan));
        return value;
    }

    /**
     * 将单位为元的金额转换为单位为毫
     *
     * @param yuan 单位为元的字符型值
     * @return
     */
    public static int yuan2Hao(String yuan) {
        int value = 0;
        try {
            BigDecimal var1 = new BigDecimal(yuan);
            BigDecimal var2 = new BigDecimal(10000);
            BigDecimal var3 = var1.multiply(var2);
            value = Integer.parseInt(var3.stripTrailingZeros().toPlainString());
        } catch (Exception e) {
            throw new IllegalArgumentException(String.format("非法金额[%s]", yuan));
        }

        Assert.isTrue(value >= 0, String.format("非法金额[%s]", yuan));
        return value;
    }

    /**
     * 将单位为分的金额转换为单位为毫
     *
     * @param yuan 单位为元的字符型值
     * @return
     */
    public static int fen2Hao(String yuan) {
        int value = 0;
        try {
            BigDecimal var1 = new BigDecimal(yuan);
            BigDecimal var2 = new BigDecimal(100);
            BigDecimal var3 = var1.multiply(var2);
            value = Integer.parseInt(var3.stripTrailingZeros().toPlainString());
        } catch (Exception e) {
            throw new IllegalArgumentException(String.format("非法金额[%s]", yuan));
        }

        Assert.isTrue(value >= 0, String.format("非法金额[%s]", yuan));
        return value;
    }

    /**
     * 将单位为毫的金额转换为单位为元
     *
     * @param fen 单位为分的字符型值
     * @return
     */
    public static String hao2Yuan(long fen) {
        BigDecimal var1 = new BigDecimal(fen);
        BigDecimal var2 = new BigDecimal(10000);
        BigDecimal var3 = var1.divide(var2);
        return var3.stripTrailingZeros().toPlainString();
    }

    /**
     * 将单位为分的金额转换为单位为元
     *
     * @param fen 单位为分的字符型值
     * @return
     */
    public static String fen2Yuan(long fen) {
        BigDecimal var1 = new BigDecimal(fen);
        BigDecimal var2 = new BigDecimal(100);
        BigDecimal var3 = var1.divide(var2);
        DecimalFormat df = new DecimalFormat("0.00");
        return df.format(var3);
    }

    /**
     * 将单位为分的金额转换为单位为元
     *
     * @param fen 单位为分的字符型值
     * @return
     */
    public static BigDecimal fen2YuanDecimal(long fen) {
        BigDecimal var1 = new BigDecimal(fen);
        BigDecimal var2 = new BigDecimal(100);
        BigDecimal var3 = var1.divide(var2);
        return var3;
    }

    /**
     * 计算分账金额，并将结果转换为整数，乘以 10000
     *
     * @param totalAmountInFen 总金额，以“分”为单位
     * @param ratio            比例，以百分比形式表示（如 20.00 表示 20%）
     * @return 计算后的分账金额，转换为整数并乘以 10000（返回的金额以毫元为单位）
     */
    public static long calculateShareAmountInMilliUnits(long totalAmountInFen, double ratio) {
        // 计算分账金额，保留精度
        BigDecimal totalAmount = BigDecimal.valueOf(totalAmountInFen);
        BigDecimal shareRatio = BigDecimal.valueOf(ratio).divide(BigDecimal.valueOf(100));
        BigDecimal shareAmountInFen = totalAmount.multiply(shareRatio);

        // 转换为毫元并返回
        return shareAmountInFen.multiply(BigDecimal.valueOf(100)).setScale(0, BigDecimal.ROUND_HALF_UP).longValue();
    }

}